<?php

	/**
	 * This file is part of Twig.
	 *
	 * (c) 2009 Fabien Potencier
	 *
	 * For the full copyright and license information, please view the LICENSE
	 * file that was distributed with this source code.
	 *
	 * @author     Henrik Bjornskov <hb@peytz.dk>
	 * @package    Twig
	 * @subpackage Twig-extensions
	 */
	class Twig_Extension_Text extends Twig_Extension {
		/**
		 * Returns a list of filters.
		 *
		 * @return array
		 */
		public function getFilters() {
			return array(
				'truncate'     => new Twig_Filter_Function('twig_truncate_filter', array('needs_environment' => true)),
				'substr'       => new Twig_Filter_Function('twig_substr_filter', array('needs_environment' => true)),
				'wordwrap'     => new Twig_Filter_Function('twig_wordwrap_filter', array('needs_environment' => true)),
				'nl2br'        => new Twig_Filter_Function('twig_nl2br_filter', array(
						'pre_escape' => 'html',
						'is_safe'    => array('html')
					)),
				'trim'         => new Twig_Filter_Function('trim'),
				'repeat'       => new Twig_Filter_Function('str_repeat'),
				'rus_month'    => new Twig_Filter_Function('twig_rus_month_filter'),
				'money_propis' => new Twig_Filter_Function('twig_money_propis_filter'),
				'rusurl'       => new Twig_Filter_Function('twig_rusurl_filter'),
				'hide'         => new Twig_Filter_Function('twig_hide_filter'),
			);
		}

		/**
		 * Name of this extension
		 *
		 * @return string
		 */
		public function getName() {
			return 'Text';
		}
	}

	function twig_nl2br_filter($value, $sep = '<br />') {
		return str_replace("\n", $sep . "\n", $value);
	}


	function twig_truncate_filter(Twig_Environment $env, $value, $length = 30, $preserve = false, $separator = '...') {
		if (function_exists('mb_get_info')) {
			if (mb_strlen($value, $env->getCharset()) > $length) {
				if ($preserve) {
					if (false !== ($breakpoint = mb_strpos($value, ' ', $length, $env->getCharset()))) {
						$length = $breakpoint;
					}
				}

				return mb_substr($value, 0, $length, $env->getCharset()) . $separator;
			}
		} else {
			if (strlen($value) > $length) {
				if ($preserve) {
					if (false !== ($breakpoint = strpos($value, ' ', $length))) {
						$length = $breakpoint;
					}
				}

				return substr($value, 0, $length) . $separator;
			}
		}

		return $value;
	}

	function twig_wordwrap_filter(Twig_Environment $env, $value, $length = 80, $separator = "\n", $preserve = false) {
		if (function_exists('mb_get_info')) {
			$sentences = array();

			$previous = mb_regex_encoding();
			mb_regex_encoding($env->getCharset());

			$pieces = mb_split($separator, $value);
			mb_regex_encoding($previous);

			foreach ($pieces as $piece) {
				while (!$preserve && mb_strlen($piece, $env->getCharset()) > $length) {
					$sentences[] = mb_substr($piece, 0, $length, $env->getCharset());
					$piece       = mb_substr($piece, $length, 2048, $env->getCharset());
				}

				$sentences[] = $piece;
			}

			return implode($separator, $sentences);
		} else {
			return wordwrap($value, $length, $separator, !$preserve);
		}
	}

	function twig_substr_filter(Twig_Environment $env, $value, $start, $length = null) {
		if (function_exists('mb_get_info')) {
			return mb_substr($value, $start, $length, $env->getCharset());
		} else {
			return substr($value, $start, $length);
		}
	}

	function twig_rus_month_filter($month, $many = true) {
		if ($month == '1') {
			return ($many) ? 'Января' : 'Январь';
		}
		if ($month == 2) {
			return ($many) ? 'Февраля' : 'Февраль';
		}
		if ($month == 3) {
			return ($many) ? 'Марта' : 'Март';
		}
		if ($month == '4') {
			return ($many) ? 'Апреля' : 'Апрель';
		}
		if ($month == 5) {
			return ($many) ? 'Мая' : 'Мац';
		}
		if ($month == 6) {
			return ($many) ? 'Июня' : 'Июнь';
		}
		if ($month == 7) {
			return ($many) ? 'Июля' : 'Июль';
		}
		if ($month == 8) {
			return ($many) ? 'Августа' : 'Август';
		}
		if ($month == 9) {
			return ($many) ? 'Сентября' : 'Сентябрь';
		}
		if ($month == 10) {
			return ($many) ? 'Октября' : 'Октябрь';
		}
		if ($month == 11) {
			return ($many) ? 'Ноября' : 'Ноябрь';
		}
		if ($month == 12) {
			return ($many) ? 'Декабря' : 'Декабрь';
		}

		return 'error';
	}

	function twig_money_propis_filter($rub) {

		$dop0 = Array("рублей", "тысяч", "миллионов", "миллиардов");
		$dop1 = Array("рубль", "тысяча", "миллион", "миллиард");
		$dop2 = Array("рубля", "тысячи", "миллиона", "миллиарда");
		$s1   = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять");
		$s11  = Array("", "одна", "две", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять");
		$s2   = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто");
		$s22  = Array("десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать");
		$s3   = Array("", "сто", "двести", "триста", "четыреста");

		if ($rub == 0) { // если это 0
			return "ноль " . $dop0[0];
		}

		$res     = '';
		$triplet = array();

		// разбиваем полученное число на тройки и загоняем в массив $triplet
		$t_count = (int)ceil(strlen($rub) / 3);
		for ($i = 0; $i < $t_count; $i++) {
			$k           = $t_count - $i - 1;
			$triplet[$k] = $rub % 1000;
			$rub         = floor($rub / 1000);
		}

		// пробегаем по триплетам
		for ($i = 0; $i < $t_count; $i++) {

			$t  = $triplet[$i]; // это текущий триплет - с ним и работаем
			$k  = $t_count - $i - 1;
			$n1 = (int)floor($t / 100);
			$n2 = (int)floor(($t - $n1 * 100) / 10);
			$n3 = $t - $n1 * 100 - $n2 * 10;

			// обрабатываем сотни
			if ($n1 < 5) {
				$res .= $s3[$n1] . " ";
			} elseif ($n1) {
				$res .= $s1[$n1] . "сот ";
			}

			if ($n2 > 1) { // второй десяток
				$res .= $s2[$n2] . " ";
				if ($n3 and $k == 1) { // если есть единицы в триплете и это триплет ТЫСЯЧ
					$res .= $s11[$n3] . " ";
				} elseif ($n3) {
					$res .= $s1[$n3] . " ";
				}
			} elseif ($n2 == 1) {
				$res .= $s22[$n3] . " ";
			} elseif ($n3 and $k == 1) { // если есть единицы в триплете и это триплет ТЫСЯЧ
				$res .= $s11[$n3] . " ";
			} elseif ($n3) {
				$res .= $s1[$n3] . " ";
			}

			// прилепляем в конец триплета коммент
			if ($n3 == 1 and $n2 != 1) { // в конце триплета стоит 1, но не 11.
				$res .= $dop1[$k] . " ";
			} elseif ($n3 > 1 and $n3 < 5 and $n2 != 1) { // в конце триплета стоит 2, 3 или 4, но не 12, 13 или 14
				$res .= $dop2[$k] . " ";
			} elseif ($t or $k == 0) {
				$res .= $dop0[$k] . " ";
			}
		}
		$kopeek = round(($rub - round($rub)) * 100);
		$kopeek = $kopeek < 10 ? '0' . $kopeek : $kopeek;
		$res .= ' ' . $kopeek . ' копеек';

		return $res;
	}

	function twig_rusurl_filter($string) {
		$string = str_replace("ж", "zh", $string);
		$string = str_replace("ё", "yo", $string);
		$string = str_replace(array('и', 'й', '&'), "i", $string);
		$string = str_replace("ю", "yu", $string);
		$string = str_replace("ь", "", $string);
		$string = str_replace("ч", "ch", $string);
		$string = str_replace("щ", "sch", $string);
		$string = str_replace("ц", "c", $string);
		$string = str_replace("у", "u", $string);
		$string = str_replace("к", "k", $string);
		$string = str_replace("е", "e", $string);
		$string = str_replace("н", "n", $string);
		$string = str_replace("г", "g", $string);
		$string = str_replace("ш", "sh", $string);
		$string = str_replace("з", "z", $string);
		$string = str_replace("х", "h", $string);
		$string = str_replace("ъ", "", $string);
		$string = str_replace("ф", "f", $string);
		$string = str_replace("ы", "y", $string);
		$string = str_replace("в", "v", $string);
		$string = str_replace("а", "a", $string);
		$string = str_replace("п", "p", $string);
		$string = str_replace("р", "r", $string);
		$string = str_replace("о", "o", $string);
		$string = str_replace("л", "l", $string);
		$string = str_replace("д", "d", $string);
		$string = str_replace("э", "yе", $string);
		$string = str_replace("я", "ja", $string);
		$string = str_replace("с", "s", $string);
		$string = str_replace("м", "m", $string);
		$string = str_replace("т", "t", $string);
		$string = str_replace("б", "b", $string);
		$string = str_replace("Й", "I", $string);
		$string = str_replace("Ю", "YU", $string);
		$string = str_replace("Ч", "CH", $string);
		$string = str_replace("Ь", "", $string);
		$string = str_replace("Щ", "SCH", $string);
		$string = str_replace("Ц", "C", $string);
		$string = str_replace("У", "U", $string);
		$string = str_replace("К", "K", $string);
		$string = str_replace("Е", "E", $string);
		$string = str_replace("Н", "N", $string);
		$string = str_replace("Г", "G", $string);
		$string = str_replace("Ш", "SH", $string);
		$string = str_replace("З", "Z", $string);
		$string = str_replace("Х", "H", $string);
		$string = str_replace("Ъ", "", $string);
		$string = str_replace("Ф", "F", $string);
		$string = str_replace("Ы", "Y", $string);
		$string = str_replace("В", "V", $string);
		$string = str_replace("А", "A", $string);
		$string = str_replace("П", "P", $string);
		$string = str_replace("Р", "R", $string);
		$string = str_replace("О", "O", $string);
		$string = str_replace("Л", "L", $string);
		$string = str_replace("Д", "D", $string);
		$string = str_replace("Ж", "Zh", $string);
		$string = str_replace("Э", "Ye", $string);
		$string = str_replace("Я", "Ja", $string);
		$string = str_replace("С", "S", $string);
		$string = str_replace("М", "M", $string);
		$string = str_replace("И", "I", $string);
		$string = str_replace("Т", "T", $string);
		$string = str_replace("Б", "B", $string);
		$string = str_replace(array(' ', '/', '\\'), "-", $string);
		$string = str_replace(array('.', ','), "", $string);

		$string = strtolower($string);

		return $string;
	}

	function twig_hide_filter($string, $symbol = '#') {
		return str_repeat($symbol, mb_strlen($string));
	}
